package com.learn.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 《Spring源码深度解析》11.4.6 HandlerInterceptor 的处理  P333
 *  在 DispatcherServlet#doDispatcher() 方法中进行前置和后置遍历
 *
 *  文章：springMVC自定义拦截器
 *  链接：https://www.jianshu.com/p/d165262cb1a3
 */
public class MyTestInterceptor implements HandlerInterceptor {

	/**
	 * 处理程序请求之前调用
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		long startTime = System.currentTimeMillis();
		request.setAttribute("startTime", startTime);
		// 这个方法返回true，允许 DispatcherServlet 继续处理请求
		return true;
	}

	/**
	 * 处理程序请求之后调用
	 * 第二个方法允许返回一个 ModelAndView
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response,
						   Object handler, ModelAndView modelAndView) throws Exception {

		long startTime = (Long) request.getAttribute("startTime" );
		request.removeAttribute("startTime");
		long endTime = System.currentTimeMillis();
		// 把这个时间添加到模型中，传递给视图
		modelAndView.addObject("handlingTime",endTime-startTime);
	}

	/**
	 * 在所有请求处理完成之后被调用的（如视图呈现之后）
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
								Object handler, Exception ex) throws Exception {
		// 无事可做，空着就行
	}

}
